package com.smartboot.plus.service;

import com.alibaba.fastjson2.JSON;
import com.smartboot.plus.dto.UserDTO;
import com.smartboot.plus.exception.ServiceException;
import com.smartboot.plus.launch.LauncherService;
import com.smartboot.plus.vo.MqttUserVO;
import org.apache.commons.lang3.StringUtils;
import tech.smartboot.feat.cloud.annotation.Bean;
import tech.smartboot.feat.core.server.Session;

import java.util.ArrayList;
import java.util.List;

/**
 * MQTT用户服务类，提供了用户登录、获取用户信息、获取权限码和退出登录等功能。
 */
@Bean
public class MqttUserService {

    /**
     * 平台登录方法。
     *
     * @param session  当前会话对象
     * @param userDTO  用户登录信息传输对象
     * @return 登录成功后返回的用户信息对象
     * @throws ServiceException 如果登录失败或发生异常
     */
    public MqttUserVO login(Session session, UserDTO userDTO) throws ServiceException {
        try {


            // 从系统属性中获取配置的用户名和密码
            String username = System.getProperty(LauncherService.CONFIG_USER_USER_NAME);
            String password = System.getProperty(LauncherService.CONFIG_USER_PASSWORD);

            // 验证用户名和密码是否匹配
            if (!StringUtils.equals(username, userDTO.getUsername()) || !StringUtils.equals(password, userDTO.getPassword())) {
                throw new ServiceException("账号密码错误");
            }

            // 构造用户信息对象
            MqttUserVO mqttUserVO = new MqttUserVO();
            setUserRolesAndRealName(mqttUserVO);

            // 设置访问令牌（使用sessionId）
            String accessToken = session.getSessionId();
            mqttUserVO.setAccessToken(accessToken);

            // 将用户信息保存到session
            session.put(accessToken, username);

            return mqttUserVO;
        } catch (Exception e) {
            throw new ServiceException(e.toString());
        }
    }

    /**
     * 设置用户的角色和真实姓名。
     *
     * @param mqttUserVO 用户信息对象
     */
    private void setUserRolesAndRealName(MqttUserVO mqttUserVO) {
        List<String> roles = new ArrayList<>();
        roles.add("super");
        mqttUserVO.setRoles(roles);
        mqttUserVO.setRealName("Admin");
    }

    /**
     * 获取当前登录用户的信息。
     *
     * @return 包含用户信息的对象
     */
    public Object info() {
        String str = "{"
                + "    \"id\": 1,"
                + "    \"realName\": \"Admin\","
                + "    \"roles\": ["
                + "      \"super\""
                + "    ],"
                + "    \"username\": \"Admin\""
                + "}";
        return JSON.parse(str);
    }

    /**
     * 获取所有可用的权限码。
     *
     * @return 权限码列表
     */
    public Object codes() {
        String str = "[\n"
                + "    \"AC_100100\",\n"
                + "    \"AC_100110\",\n"
                + "    \"AC_100120\",\n"
                + "    \"AC_100010\"\n"
                + "]";
        return JSON.parse(str);
    }

    /**
     * 用户退出登录。
     *
     * @param session 当前会话对象
     * @return 是否成功退出登录
     * @throws ServiceException 如果退出登录过程中发生异常
     */
    public boolean logout(Session session) throws ServiceException {
        try {
            session.invalidate();
            return true;
        } catch (Exception e) {
            throw new ServiceException(e.toString());
        }
    }
}



